package br.com.datasun.biblioteca.ui.components;

import java.sql.Date;
import java.util.ArrayList;
import java.util.List;

import javax.swing.table.AbstractTableModel;

import org.omg.PortableServer.LIFESPAN_POLICY_ID;

import br.com.datasun.biblioteca.entities.Assunto;
import br.com.datasun.biblioteca.entities.Biblioteca;
import br.com.datasun.biblioteca.entities.Documento;
import br.com.datasun.biblioteca.entities.Autor;
import br.com.datasun.biblioteca.entities.PessoaFisica;
import br.com.datasun.biblioteca.entities.Categoria;
import br.com.datasun.biblioteca.entities.Exemplar;
import br.com.datasun.biblioteca.entities.Livro;

public class ConsultaClienteTableModel extends AbstractTableModel {
	private static final long serialVersionUID = 1L;
	private List<PessoaFisica> clientes;
	private List<String> colunas;
	
	public final int COLUNA_NOME = 0;
	public final int COLUNA_EMAIL = 1;
	public final int COLUNA_CPF = 2;
	public final int COLUNA_RG = 3;
	public final int COLUNA_STATUS = 4;
	
	public ConsultaClienteTableModel(List<PessoaFisica> clientes){
		this.clientes = clientes;
		if(this.clientes == null){
			this.clientes = new ArrayList<PessoaFisica>();
		}
		/**
		 * Inicializa a lista que cont�m os nomes das colunas da tabela
		 */
		colunas = new ArrayList<String>();
		colunas.add("Nome");
		colunas.add("Email");
		colunas.add("CPF");
		colunas.add("RG");
		colunas.add("Status");
		
	}
	
	public ConsultaClienteTableModel(){
		if(this.clientes == null){
			this.clientes = new ArrayList<PessoaFisica>();
		}
		/**
		 * Inicializa a lista que cont�m os nomes das colunas da tabela
		 */
		colunas = new ArrayList<String>();
		colunas.add("Nome");
		colunas.add("Email");
		colunas.add("CPF");
		colunas.add("RG");
		colunas.add("Status");
	}
	
	/**
	 * Obt�m o n�mero de colunas da tabela
	 */
	public int getColumnCount() {
		return colunas.size();
	}
	/**
	 * Obtem o n�mero de linhas da tabela
	 */
	public int getRowCount() {
		return clientes.size();
	}
	
	/**
	 * Obt�m o valor contido na linha representada por indiceLinha e coluna representada por indiceColuna. 
	 * @param indiceLinha - indice da linha
	 * @param indiceColuna - indice da coluna
	 */
	public Object getValueAt(int indiceLinha, int indiceColuna) {
		String result = null;
		PessoaFisica cliente = null;
		cliente = clientes.get(indiceLinha); 
		List<Documento> documentos = cliente.getDocumentos();
		
						
		switch (indiceColuna) {
		case COLUNA_NOME:
			result = cliente.getNome();
			break;
		case COLUNA_EMAIL :
			result = cliente.getEmail();
			break;
		case COLUNA_CPF :
			if (!documentos.isEmpty()){
				Documento documento = cliente.getCPF();
				result = documento.getNumero();
			}
			else {
				result = "";
			}
			break;
		case COLUNA_RG :
			if (!documentos.isEmpty()){
				Documento documento = cliente.getRG();
				if (documento!=null){
				  result = documento.getNumero();
				}
			}
			else {
				result = "";
			}
			break;
		case COLUNA_STATUS :
			if (cliente.isAtivo()) {
				result = "Ativo";
			}
			else {
				result = "Inativo";
			}
			break;
					
		}
		return result;
	}
	
	/**
	 * Obt�m o t�tulo da coluna
	 */
	public String getColumnName(int column) {
		return colunas.get(column);
	}
	/**
	 * Obt�m o tipo de objeto que a coluna aceita
	 */
	public Class<?> getColumnClass(int columnIndex) {
		Class result = null;
		switch (columnIndex) {
		case COLUNA_NOME:
			result = String.class;
			break;
		case COLUNA_EMAIL:
			result = String.class;
			break;
		case COLUNA_CPF:
			result = Integer.class;
			break;
		case COLUNA_RG :
			result = String.class;
			break;
		case COLUNA_STATUS :
			result = String.class;
			break;
		}
		return result;
	}
	
	/**
	 * Altera o valor da coluna representada por indiceColuna e linha representada por indiceLinha.
	 */
	public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
		//nenhuma celula � edit�vel

	}

	@Override
	public boolean isCellEditable(int rowIndex, int columnIndex) {
		return false; //nenhuma c�lula � edit�vel
	}
	
	public List<PessoaFisica> getCliente(){
		return this.clientes;
	}
	
	public PessoaFisica getClienteDe(int rowIndex){
		PessoaFisica cliente = null;
		if(rowIndex >= 0 && !clientes.isEmpty()){
			cliente = clientes.get(rowIndex);
		}
		return cliente;
	}
	
	
	public void setConsultaCliente(List<PessoaFisica> clientes){
		this.clientes = clientes;
		fireTableStructureChanged();
	}	
	
	public void limparConsultaCliente(){
		
	}

}
